#ifndef HDL_UART_H_
#define HDL_UART_H_

#include "gd32f4xx_dma.h"

#include "FreeRTOS.h"
#include <semphr.h>

#include "board_cfg.h"
/*******************************************************************************
 * Definitions
 ******************************************************************************/

/*******************************************************************************
 * Variables
 ******************************************************************************/
/*!< USART配置结构体 
  默认配置：
  - 8位数据位
  - 无校验位
  - 1位停止位*/
 typedef struct
{
    /* USART GPIO配置 */
    BOARD_AF_CFG tx_cfg;
    BOARD_AF_CFG rx_cfg;
    /* USART参数配置 */
    uint32_t usart_periph;//< USART外设地址
    uint32_t baudval;      //< 波特率值
    uint32_t msbf;         //< MSB/LSB 位优先:USART_MSBF_MSB/USART_MSBF_LSB
    /*NVIV中断配置*/
    IRQn_Type tx_irq_type;      //< 发送中断
    uint8_t   tx_irq_priority;  //< 发送中断优先级
    IRQn_Type rx_irq_type;      //< 接收中断
    uint8_t   rx_irq_priority;  //< 接收中断优先级
    /* DMA配置 */
    uint32_t               tx_dma_periph;//< DMA外设地址
    dma_channel_enum       tx_channelx;  //< DMA通道号
    dma_subperipheral_enum tx_sub_periph;  //< DMA子外设号
    uint8_t*               txbuffer;     //< 发送缓冲区
    uint32_t               txbuf_len;    //< 发送缓冲区长度

    uint32_t               rx_dma_periph;//< DMA外设地址
    dma_channel_enum       rx_channelx;  //< DMA通道号
    dma_subperipheral_enum rx_sub_periph;  //< DMA子外设号
    uint8_t*               rxbuffer;     //< 接收缓冲区
    uint32_t               rxbuf_len;    //< 接收缓冲区长度
    
    SemaphoreHandle_t   TxSem;
	SemaphoreHandle_t   RxSem;
	SemaphoreHandle_t   TxMutex;
}HDL_USART_CFG;
 /******************************************************************************
 * Code
 ******************************************************************************/
 /**
 * @brief USART初始化
 * @param cfg: USART配置
 * @return 成功返回pdPASS，失败返回pdFAIL
 */
BaseType_t vHdl_UartInit(HDL_USART_CFG* cfg);
/**
 * @brief USART发送数据
 * @param  cfg   : USART配置
 * @param  data  : 待发送数据
 * @param  len   : 待发送数据长度
 */
void vHdl_Uart_PollingWrite(HDL_USART_CFG* cfg, uint8_t* data, uint32_t len );
/**
 * @brief USART DMA发送数据
 * @param  cfg   : USART配置
 * @param  data  : 待发送数据
 * @param  len   : 待发送数据长度
 */
BaseType_t vHdl_Uart_DMAWrite(HDL_USART_CFG* cfg, uint8_t* data, uint32_t len);
#endif /* HDL_UART_H_ */
